# -*- coding: utf-8 -*-
'''
Created on 31/01/2010

@author: joger quintero
'''

import wx
import sys
import os
import wx.aui
import datetime
import time
import re
from wx.lib.evtmgr import eventManager
from wx.lib.mixins.listctrl import CheckListCtrlMixin


#import imagenes.images
from comun import mensageError as msje, mensageAlerta as msja, mensajePregunta as msjp, curry, dropArgs
from imagenes import images
from cifrar.controlador import Controlador


#------------------------------------------------------------------------------
"""
DESCOMENTAR EN CASO DE FALLAR
class TestListCtrl(wx.ListCtrl):
    
    def __init__(self, parent, ID, pos=wx.DefaultPosition,
                 size=(825,498), style=0):
        wx.ListCtrl.__init__(self, parent, ID, pos, size, style)
        #listmix.ListCtrlAutoWidthMixin.__init__(self)
"""
#------------------------------------------------------------------------------
"""
class MyTreeCtrl(wx.TreeCtrl):
    def __init__(self, parent, id, pos,size, style):
        wx.TreeCtrl.__init__(self, parent, id, pos, size, style)
        

    def OnCompareItems(self, item1, item2):
        t1 = self.GetItemText(item1)
        t2 = self.GetItemText(item2)
        #self.log.WriteText('compare: ' + t1 + ' <> ' + t2 + '\n')
        if t1 < t2: return -1
        if t1 == t2: return 0
        return 1
"""
#------------------------------------------------------------------------------
class VistaCifrar(wx.Panel):
    '''
    classdocs
    '''

    def __init__(self,ventanaMadre):
        '''
        Constructor
        '''
                 
        self.ventanaHija = None
        self.treeSeleccionado = None
        self.itemListeleccionado = None
        self.itemDirAnhadido = None
        self.radio = None
        
        self.controlador = Controlador(self)
        #Ids del tool
        self.idCrearUnidad = 2000
        self.idMontarUnidad = 2010
        self.idDesmontarUnidad = 2020
        self.idBorrarPapelera = 2030
        #Ids del menu
        self.idMenuCU = 500
        self.idMenuMU = 501
        #self.idMenuEU = 504
        self.idMenuVU = 502
        self.idMenuUN = 503
        self.idMenuCELL = 600
        self.idMenuILL = 610       
        self.idMenuELL = 620
        self.idMenuCLL = 630
        #Ids de los radioButton
        self.idRadio1 = 5000
        self.idRadio2 = 5001
        self.idRadio3 = 5002
        #Ids de los botones de Cifrar, Firmar ...
        self.idCifrar = 701
        self.idDescifrar = 702
        self.idFirmar = 703
        self.idVerificar = 704
        self.idCifFir = 705
        self.idVerDesc = 706
        self.idBorrar = 707
                 
        #La ventana principal de la aplicacion
        self.parent = ventanaMadre.parent
        wx.Panel.__init__(self, ventanaMadre, -1)
        
        
        
        self.SetAutoLayout(True)
        self.construirInterface()
        self.crearEventos()
    
    def construirInterface(self):
        #self.tool()
        #self.menu()
        self.crearVentanas()
        self.crearAuiManager()
        
    def tool(self):
        
        self.parent.tb.ClearTools()
        self.parent.tb.AddSeparator()
        self.parent.tb.AddLabelTool(self.idCrearUnidad, "", images.getFileNew32Bitmap(), shortHelp="Crear Unidad: Inserta carpetas o sistema de archivos cifrado.")#longHelp="Long help for 'New'"
        self.parent.tb.AddLabelTool(self.idMontarUnidad, "", images.getFileOpen32Bitmap(), shortHelp="Montar Unidad: Integra un sistema de archivos alojado en un determinado dispositivo dentro del árbol de directorios de un sistema operativo.")
        self.parent.tb.AddLabelTool(self.idDesmontarUnidad, "", images.getFileClose32Bitmap(), shortHelp="Desmontar Unidad: Acción de extraer un sistema de archivos alojado dentro del árbol de directorios de un sistema operativo.")
        self.parent.tb.AddLabelTool(self.idBorrarPapelera, "", images.getPapelera25x25Bitmap(), shortHelp="Borrado Seguro de la papelera: Elimina datos de la papelera del usuario conectado de forma segura, los sobrescribe para impedir cualquier posibilidad de recuperación.")
        
        
        
        #self.controlador.habilitarDesmontarUnidad(False)
        #self.controlador.habilitarEliminarUnidad(False)
    
    def menu(self):        
        
        self.itemsMenuUnidades = wx.Menu()
        #Item 1
        item = wx.MenuItem(self.itemsMenuUnidades, self.idMenuCU, "&Crear Unidad\tCtrl+C", "")        
        item.SetBitmap(images.getFileNew32Bitmap())
        self.itemsMenuUnidades.AppendItem(item)
        #Item 2
        item = wx.MenuItem(self.itemsMenuUnidades, self.idMenuMU, "&Montar Unidad\tCtrl+M", "")
        item.SetBitmap(images.getFileOpen32Bitmap())
        self.itemsMenuUnidades.AppendItem(item)
        #Item 3
        ##item = wx.MenuItem(self.itemsMenuUnidades, self.idMenuEU, "&Eliminar Unidad\tCtrl+E", "")
        ##item.SetBitmap(images.getDeleteGroup32Bitmap())
        ##self.itemsMenuUnidades.AppendItem(item)
        #Separador
        self.itemsMenuUnidades.AppendSeparator()

        #Item 4
        item = wx.MenuItem(self.itemsMenuUnidades, self.idMenuVU, "&Ver\tCtrl+V", "")
        item.SetBitmap(images.getFileOpen32Bitmap())
        self.itemsMenuUnidades.AppendItem(item)
        #Item 5
        item = wx.MenuItem(self.itemsMenuUnidades, self.idMenuUN, "&Desmontar Unidad\tCtrl+D", "")
        item.SetBitmap(images.getFileClose32Bitmap())
        self.itemsMenuUnidades.AppendItem(item)

        self.parent.MiMenuBar.Append(self.itemsMenuUnidades,"&Unidades")
        ################################################################
        self.itemsLlaves = wx.Menu()
        #Item 1
        item = wx.MenuItem(self.itemsLlaves, self.idMenuCELL, "Crear &Llave\tCtrl+L", "")        
        self.itemsLlaves.AppendItem(item)

        #Item 2
        item = wx.MenuItem(self.itemsLlaves, self.idMenuILL, "&Importar Llave\tCtrl+I", "")        
        self.itemsLlaves.AppendItem(item)

        #Item 3
        item = wx.MenuItem(self.itemsLlaves, self.idMenuELL, "E&xportar Llave\tCtrl+X", "")        
        self.itemsLlaves.AppendItem(item)
       
        #Item 4
        item = wx.MenuItem(self.itemsLlaves, self.idMenuCLL, "Con&sultar Llaves\tCtrl+S", "")        
        self.itemsLlaves.AppendItem(item)

        self.parent.MiMenuBar.Append(self.itemsLlaves,"Lla&ves")
    
    def crearVentanas(self):
        
        #Creamos la ventana del centro
        self.panelA = wx.Window(self, -1, style=wx.NO_BORDER)
        #Llamamos al método que creara los componentes de la ventana
        self.crearComponentesPanelA()
                    
        ###################################################################
        self.panelB = wx.Window(self, -1, style=wx.NO_BORDER)
        self.crearMenuIzquierdo()
        
        self.panelC = wx.Window(self, -1, style=wx.NO_BORDER)
        self.panelC.SetBackgroundColour(wx.WHITE)
        self.txtPanelC = wx.StaticText(
                    self.panelC, -1,
                    "",
                    (5,5), (-1, 50)
                    )
        
        self.panelD = wx.Window(self,-1,style=wx.NO_BORDER)            
        self.crearMenuDerecho()
    
    
    def crearMenuDerecho(self):
        
        boxPanelDerecho = wx.BoxSizer(wx.VERTICAL)
        ############LISTCRTL UNIDADES#############################################################
        self.listUnidades = wx.ListCtrl(self.panelD, -1,size=(235,480), style=wx.BORDER_SUNKEN
                                 | wx.LC_REPORT 
                                 #| wx.BORDER_NONE
                                 #| wx.LC_EDIT_LABELS
                                 #| wx.LC_SORT_ASCENDING
                                 #| wx.LC_NO_HEADER
                                 | wx.LC_VRULES
                                 | wx.LC_HRULES
                                 ##| wx.LC_SINGLE_SEL
                                 )

        

        #self.listaImagenes = wx.ImageList(16, 16)
        #Cramos la  imagen de carpeta en a lista del listctrl
        #self.directorio = self.listaImagenes.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, (16,16)))
        #self.archivo = self.listaImagenes.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, (16,16)))

        
        self.listUnidades.SetImageList(self.listaImagenes, wx.IMAGE_LIST_SMALL)
        self.listUnidades.InsertColumn(0, "Unidad")
        self.listUnidades.SetColumnWidth(0,130)
        self.listUnidades.InsertColumn(1, "Estado")
        self.listUnidades.SetColumnWidth(1,105)
        
        self.controlador.listarUnidades()
        
        boxPanelDerecho.Add(self.listUnidades,0,wx.ALL,0)
        #Fijamos  los componentes a la ventana
        self.panelD.SetSizer(boxPanelDerecho)
        #boxVertical.Fit(self.panelA) #ESTO FIJA LA VENTANA AL TAMAÑO DEL object_1
        self.panelD.Layout()
        
    def crearComponentesPanelA(self):
        
        #Procedemos a crear los elementos del formularios
        ##boxVertical = wx.BoxSizer(wx.VERTICAL)
        ##tGuardar = wx.StaticBox(self.panelA, -1, "ALMACENAMIENTO")
        ##boxGuardar = wx.StaticBoxSizer(tGuardar,wx.HORIZONTAL)
        ##boxGuardar = wx.BoxSizer(wx.HORIZONTAL)
        #boxGuardar.SetMinSize((300,-1))
        ##self.lGuardar = wx.StaticText(self.panelA,-1,'Guardar en:')
        ##self.iGuardar = wx.TextCtrl(self.panelA,-1,size=(120,25))
        ##self.iGuardar.Enable(False)
        ##self.bGuardar = wx.Button(self.panelA, -1, "...", size=(25,25))
        ##self.bGuardar.Enable(False)
        ##boxGuardar.Add(self.lGuardar,0,wx.ALL,0)
        ##boxGuardar.Add(self.iGuardar,0,wx.ALL,0)
        ##boxGuardar.Add(self.bGuardar,0,wx.ALL,0)
        ##boxVertical.Add(boxGuardar,0,wx.ALL,5)
        
        ##LINEA DE SEPARACIÓN
        ##static_line_1 = wx.StaticLine(self.panelA, -1,style= wx.LI_HORIZONTAL)##size=(600,-1)
        ##boxVertical.Add(static_line_1,0, wx.ALL,3)
        
        #################FORMULARIO CIFRAR/FIRMAR#####################################
        ##tCifrarFirmar = wx.StaticBox(self.panelA, -1, "Procesar Archivos")
        ##boxCifrarFirmar = wx.StaticBoxSizer(tCifrarFirmar,wx.VERTICAL)
        #boxCifrarFirmar.SetMinSize((500,-1))
        #COMPONENTES
        ##self.radio1 = wx.RadioButton(self.panelA, self.idRadio1, "Enviar", style = wx.RB_GROUP)
        ##self.ckCifrar = wx.CheckBox(self.panelA, -1,'Cifrar')
        ##self.ckFirmar = wx.CheckBox(self.panelA, -1,'Firmar')
        #Añadimos componentes a 
        ##boxCifrarFirmar.Add(self.radio1,0,wx.ALL,0)
        ##boxCifrarFirmar.Add(self.ckCifrar,0,wx.LEFT,10)
        ##boxCifrarFirmar.Add(self.ckFirmar,0,wx.LEFT,10)
        #Creamos componentes
        ##self.radio2 = wx.RadioButton(self.panelA, self.idRadio2, "Recibidos")#wx.RadioButton(
        ##self.ckDescifrar = wx.CheckBox(self.panelA, -1,'Descifrar')
        ##self.ckDescifrar.Enable(False)
        ##self.ckVerificar = wx.CheckBox(self.panelA, -1,'Verificar Firma')
        ##self.ckVerificar.Enable(False)
        #Añadimos componentes a 
        ##boxCifrarFirmar.Add(self.radio2,0,wx.ALL,0)
        ##boxCifrarFirmar.Add(self.ckDescifrar,0,wx.LEFT,10)
        ##boxCifrarFirmar.Add(self.ckVerificar,0,wx.LEFT,10)
        #Creamos componentes
        ##self.radio3 = wx.RadioButton(self.panelA, self.idRadio3, "Borrar")#style = wx.RB_GROUP
        #self.ckBorrarSeguro = wx.CheckBox(self.panelA, -1,'Seguro')
        #self.ckBorrarSeguro.Enable(False)
        #Añadimos componentes a 
        ##boxCifrarFirmar.Add(self.radio3,0,wx.ALL,0)
        #boxCifrarFirmar.Add(self.ckBorrarSeguro,0,wx.LEFT,10)
        
        ##boxVertical.Add(boxCifrarFirmar,0, wx.ALL, 5)
        #############BOTANES#########################################
        ##boxBotones = wx.BoxSizer(wx.HORIZONTAL)
        ##self.Aceptar = wx.Button(self.panelA, wx.ID_OK,size=(100,30))
        #self.Cancelar = wx.Button(self.panelA, wx.ID_CANCEL,size=(100,30))
        ##boxBotones.Add(self.Aceptar,0,wx.TOP,0)
        #boxBotones.Add(self.Cancelar,0,wx.TOP,0)        
        

        ##boxVertical.Add(boxBotones,0, wx.ALL, 5)
        
        ##############################################################################################
        ##boxdirAnhadido = wx.BoxSizer(wx.VERTICAL)
        ##boxBotonesDirA = wx.BoxSizer(wx.HORIZONTAL)
        boxBotonesDirA = wx.BoxSizer(wx.VERTICAL)
        ##self.botonAtras = wx.Button(self.panelA, wx.ID_BACKWARD,size=(95,30))
        self.botonAtras = wx.Button(self.panelA, -1,"<-",size=(40,25))
        self.botonAtras.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.botonAtras.SetToolTipString("Eliminar documento para ser procesado")
        self.botonAdelante = wx.Button(self.panelA, -1,"->",size=(40,25))
        self.botonAdelante.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.botonAdelante.SetToolTipString("Añadir documento para ser procesado")
        
        boxBotonesDirA.Add(self.botonAdelante,0,wx.TOP,0)
        boxBotonesDirA.Add(self.botonAtras,0,wx.TOP,0)

        self.dirAnhadido = wx.ListCtrl(self.panelA, -1,size=(300,320), style=wx.BORDER_SUNKEN
                                 | wx.LC_REPORT 
                                 #| wx.BORDER_NONE
                                 #| wx.LC_EDIT_LABELS
                                 #| wx.LC_SORT_ASCENDING
                                 #| wx.LC_NO_HEADER
                                 | wx.LC_VRULES
                                 #| wx.LC_HRULES
                                 | wx.LC_SINGLE_SEL)

        

        self.listaImagenes = wx.ImageList(16, 16)
        #Cramos la  imagen de carpeta en a lista del listctrl
        self.directorio = self.listaImagenes.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, (16,16)))
        self.archivo = self.listaImagenes.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, (16,16)))
        #self.imgPapelera = self.listaImagenes.Add(images.getPapelera16x16Bitmap())
                                                  

        
        self.dirAnhadido.SetImageList(self.listaImagenes, wx.IMAGE_LIST_SMALL)
        self.dirAnhadido.InsertColumn(0, "Ficheros procesar")
        self.dirAnhadido.SetColumnWidth(0,170)
        self.dirAnhadido.InsertColumn(1, "Ruta")
        self.dirAnhadido.SetColumnWidth(1,120)
        
        #index = self.dirAnhadido.InsertImageStringItem(sys.maxint,"Mis Documentos",self.directorio)
        #self.dirAnhadido.SetStringItem(index, 1,"/home/joger/Directorio")
        #self.dirAnhadido.SetItemData(index,0)
        #self.dirAnhadido.SetItemData(index,1)
        #index = self.dirAnhadido.InsertImageStringItem(sys.maxint,"Las cosas.txt",self.archivo)
        #self.dirAnhadido.SetStringItem(index, 1,"/home/joger/Iris")
        #self.dirAnhadido.SetItemData(index,0)
        #self.dirAnhadido.SetItemData(index,1)

        ##boxdirAnhadido.Add(self.dirAnhadido,0, wx.ALL, 0)
        ##boxdirAnhadido.Add(boxBotonesDirA,0, wx.LEFT, 30)
        
        #self.bCrearLlave = wx.Button(self.panelA,-1,"Crear Llave",size=(82,25))
        #self.linea = wx.StaticLine(self.panelA, -1)
        #self.bCrearLlave.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        #self.bCrearLlave.SetToolTipString("Crear un par de llaves para realizar la firma")
        self.bCifrar = wx.Button(self.panelA,self.idCifrar,"Cifrar",size=(82,25))
        self.bCifrar.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.bCifrar.SetToolTipString("Cifrar documentos: Permite ocultar el contenido del documento para que sólo el destinatario final pueda leerlo.")
        self.bDescifrar = wx.Button(self.panelA,self.idDescifrar,"Descifrar",size=(82,25))
        self.bDescifrar.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.bDescifrar.SetToolTipString("Descifrar documentos: Recupera el texto normal de un documento que había sido protegido mediante cifrado.")
        self.bFirmar = wx.Button(self.panelA,self.idFirmar,"Firmar",size=(82,25))
        self.bFirmar.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.bFirmar.SetToolTipString("Firmar documentos (Solo Extensión .txt): Comprueba que el documento no fue modificado y lo que lee es exactamente lo que redactamos.")
        self.bVerificarF = wx.Button(self.panelA,self.idVerificar,"Verificar",size=(82,25))
        self.bVerificarF.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.bVerificarF.SetToolTipString("Verificar documentos: Compruba o examina si la firma es verdadera.")
        self.bCifrarFirmar = wx.Button(self.panelA,self.idCifFir,"Cifrar/Firmar",size=(82,25))
        self.bCifrarFirmar.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.bCifrarFirmar.SetToolTipString("Firmar y cifrar documentos: Comprueba que el documento no fue modificado y ocultar el contenido del mismo para que sólo el destinatario final pueda leerlo.")
        self.bVerificarDescifrar = wx.Button(self.panelA,self.idVerDesc,"Verificar/Desc",size=(82,25))
        self.bVerificarDescifrar.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.bVerificarDescifrar.SetToolTipString("Descifrar y verificar las firma de documentos: Recupera el texto normal de un documento cifrado y comprueba si la firma es verdadera.")
        self.bBorrar = wx.Button(self.panelA,self.idBorrar,"Borrar S.",size=(82,25))
        self.bBorrar.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        self.bBorrar.SetToolTipString("Borrado Seguro de documentos: Elimina datos de tu disco duro de forma segura, los sobrescribe para impedir cualquier posibilidad de recuperación.")
        
        #self.bBorrarPapelera = wx.Button(self.panelA,self.idBorrar,"Borrar S.",size=(82,25))
        #self.bBorrarPapelera = wx.BitmapButton(self.panelA, -1, images.getPapeleraTextoBitmap(), size=(82,25))
        ##self.bBorrarPapelera = wx.Button(self.panelA,-1,"Borrar Papelera",size=(82,25))
        ##self.bBorrarPapelera.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        ##self.bBorrarPapelera.SetToolTipString("Borrado Seguro de documentos: Elimina datos de tu disco duro de forma segura, los sobrescribe para impedir cualquier posibilidad de recuperación.")
        
        
        #self.bBorrarPapelera = wx.Button(self.panelA,wx.ID_DELETE,size=(82,25))
        #self.bBorrar.SetFont(wx.Font(8, wx.DEFAULT, wx.NORMAL, wx.NORMAL, 0, ""))
        #self.bBorrar.SetToolTipString("Borrado Seguro de documentos: Elimina datos de tu disco duro de forma segura, los sobrescribe para impedir cualquier posibilidad de recuperación.")
        #/home/joger/.local/share/Trash/files/
        
        """
        boxBotones_1 = wx.BoxSizer(wx.HORIZONTAL)
        boxBotones_1.Add(self.bCifrar,0,wx.ALL,0)
        boxBotones_1.Add(self.bFirmar,0,wx.ALL,0)
        boxBotones_1.Add(self.bCifrarFirmar,0,wx.ALL,0)
        boxBotones_2 = wx.BoxSizer(wx.HORIZONTAL)
        boxBotones_2.Add(self.bVerificarF,0,wx.ALL,0)
        boxBotones_2.Add(self.bDescifrar,0,wx.ALL,0)
        boxBotones_2.Add(self.bVerificarDescifrar,0,wx.ALL,0)
        boxBotones_3 = wx.BoxSizer(wx.HORIZONTAL)
        boxBotones_3.Add(self.bBorrar,0,wx.ALL,0)
        
        
        boxDirAnhadido = wx.BoxSizer(wx.VERTICAL) 
        boxDirAnhadido.Add(self.dirAnhadido,0,wx.ALL,0)
        boxDirAnhadido.Add(boxBotones_1,0,wx.ALL,0)
        boxDirAnhadido.Add(boxBotones_2,0,wx.ALL,0)
        boxDirAnhadido.Add(boxBotones_3,0,wx.ALL,0)
        """
        #box = wx.StaticBox(self, -1, "E")
        #boxBotones_1 = wx.StaticBoxSizer(box, wx.VERTICAL)
        
        boxBotones_1 = wx.BoxSizer(wx.VERTICAL)
        #boxCrearLlaves = wx.StaticBox(self.panelA, -1, "")
        #bsizer = wx.StaticBoxSizer(boxCrearLlaves, wx.VERTICAL)
        #bsizer.Add(self.bCrearLlave,0,wx.ALL,0)
        #boxBotones_1.Add(self.bCrearLlave,0,wx.TOP,border=50)
        #boxBotones_1.Add(self.bCrearLlave,0,wx.TOP,60)
        boxBotones_1.Add(self.bCifrar,0,wx.TOP,border=50)
        boxBotones_1.Add(self.bDescifrar,0,wx.ALL,0)
        boxBotones_1.Add(self.bFirmar,0,wx.ALL,0)
        boxBotones_1.Add(self.bVerificarF,0,wx.ALL,0)
        boxBotones_1.Add(self.bCifrarFirmar,0,wx.ALL,0)
        boxBotones_1.Add(self.bVerificarDescifrar,0,wx.ALL,0)
        boxBotones_1.Add(self.bBorrar,0,wx.TOP,10)
        #boxBotones_1.Add(self.bBorrarPapelera,0,wx.TOP,0)
        
        ############# #################################################################################

        ############# FLEXGRID #################################################################################

        sz = wx.FlexGridSizer(cols=3, hgap=5, vgap=5)
        #sz.Add((35, 35))  # some space above
        #sz.Add((35, 35))
        sz.Add(boxBotonesDirA,0, wx.TOP,100)
        sz.Add(self.dirAnhadido,0, wx.EXPAND)
        sz.Add(boxBotones_1,0, wx.EXPAND)
        ##sz.Add(boxdirAnhadido, 0, wx.EXPAND)
        ##sz.Add(boxVertical, 0, wx.EXPAND)
        #sz.Add(texto3)##, 0, wx.EXPAND)
        
        #sz.AddGrowableRow(2)
        #sz.AddGrowableCol(0)
        #sz.AddGrowableCol(1)
        #sz.AddGrowableCol(2)
        
        #Fijamos  los componentes a la ventana
        self.panelA.SetSizer(sz)
        #boxVertical.Fit(self.panelA) #ESTO FIJA LA VENTANA AL TAMAÑO DEL object_1
        self.panelA.Layout()

    
    def crearMenuIzquierdo(self):
        
        boxMenuIzquierdo = wx.BoxSizer(wx.VERTICAL)
        self.dirTree = wx.GenericDirCtrl(self.panelB, -1, size=(235,480), style=0)
        self.dirTree.SetPath(os.environ['HOME'])
        
        ###tree = self.dirTree.GetTreeCtrl()
        ###tree.CollapseAllChildren(tree.GetRootItem())
        ###child = tree.AppendItem(tree.GetRootItem(),"Papelera")
        ###tree.SetPyData(child, None)
        ###isz = (20,25)
        ###il = wx.ImageList(isz[0], isz[1])
        ###tree.SetImageList(il)
        ###self.il = il
        #fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
        ###fldridx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER,      wx.ART_OTHER, isz))
        ###fldropenidx = il.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, isz))
        ###fileidx     = il.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
        ###imgPapelera = il.Add(images.getPapeleraBitmap())
        
        ###tree.SetItemImage(child, imgPapelera)
        
        #print tree.GetItemText(tree.GetLastChild(tree.GetRootItem()))
        
        
        #self.vista.tree.SetItemImage(child, self.vista.fldridx, wx.TreeItemIcon_Expanded)
        
    
        boxMenuIzquierdo.Add(self.dirTree,0,wx.ALL,5)
        
        #boxMenuIzquierdo.Add(self.listUnidades,0,wx.ALL,5)
        #######################################################################################

        self.panelB.SetSizer(boxMenuIzquierdo)
        self.panelB.Layout()

    def crearAuiManager(self):
        
        self.mgr = wx.aui.AuiManager()
        self.mgr.SetManagedWindow(self)
        self.mgr.AddPane(self.panelA, wx.aui.AuiPaneInfo().CenterPane().Name("Panel A"))
        self.mgr.AddPane(self.panelB,
                         wx.aui.AuiPaneInfo().
                         Left().Layer(2).BestSize((240, -1)).
                         MinSize((240, -1)).
                         Floatable(False).FloatingSize((240, 700)).
                         Caption("Arbol de directorio").
                         CloseButton(False).
                         Name("Panel B"))
        self.mgr.AddPane(self.panelD,
                         wx.aui.AuiPaneInfo().
                         Right().Layer(2).BestSize((240, -1)).
                         MinSize((240, -1)).
                         Floatable(False).FloatingSize((240, 700)).
                         Caption("Unidades Cifradas").
                         CloseButton(False).
                         Name("Panel D"))
        
        
        self.mgr.AddPane(self.panelC,
                         wx.aui.AuiPaneInfo().
                         Bottom().BestSize((-1, 150)).
                         MinSize((-1, 150)).
                         Floatable(False).FloatingSize((500, 160)).
                         Caption("Mensajes").
                         CloseButton(False).
                         Name("Panel C"))

        #self.auiConfigurations[DEFAULT_PERSPECTIVE] = self.mgr.SavePerspective()
        self.mgr.Update()
        self.mgr.SetFlags(self.mgr.GetFlags() ^ wx.aui.AUI_MGR_TRANSPARENT_DRAG)
            
    def crearEventos(self):

        self.Bind(wx.EVT_SIZE, self.OnCPSize)
        #Eventos Tool. Barra acceso directos        
        self.parent.Bind(wx.EVT_TOOL, self.crearUnidad,id=self.idCrearUnidad)
        self.parent.Bind(wx.EVT_TOOL, self.verificarMontarUnidad,id=self.idMontarUnidad)
        self.parent.Bind(wx.EVT_TOOL, self.desmontarUnidad,id=self.idDesmontarUnidad)
        self.parent.Bind(wx.EVT_TOOL, self.borrarPapelera,id=self.idBorrarPapelera)
        
        #Evento menu

        self.parent.Bind(wx.EVT_MENU, self.desmontarUnidad, id=self.idMenuUN)
        self.parent.Bind(wx.EVT_MENU, self.verificarMontarUnidad, id=self.idMenuMU)
        self.parent.Bind(wx.EVT_MENU, self.crearUnidad, id=self.idMenuCU)
        self.parent.Bind(wx.EVT_MENU, self.verUnidad, id=self.idMenuVU)
        #self.parent.Bind(wx.EVT_MENU, self.eliminarUnidad, id=self.idMenuEU)
        self.parent.Bind(wx.EVT_MENU, self.crearLlaves, id=self.idMenuCELL)
        self.parent.Bind(wx.EVT_MENU, self.importarLlaves, id=self.idMenuILL)
        self.parent.Bind(wx.EVT_MENU, self.exportarLlaves, id=self.idMenuELL)
        self.parent.Bind(wx.EVT_MENU, self.consultarLlaves, id=self.idMenuCLL)
        
        
        

        #Eventos para los radio buton
        ##self.Bind(wx.EVT_RADIOBUTTON, self.radioSeleccionado,self.radio1)
        ##self.Bind(wx.EVT_RADIOBUTTON, self.radioSeleccionado,self.radio2)
        ##self.Bind(wx.EVT_RADIOBUTTON, self.radioSeleccionado,self.radio3)
        
        #Eventos de los botones de la aplicación
        ##self.Bind(wx.EVT_BUTTON, self.ejecutar, self.Aceptar)
        ##self.Bind(wx.EVT_BUTTON, self.guardarEn, self.bGuardar)
        self.Bind(wx.EVT_BUTTON, self.controlador.eventoCifrar, self.bCifrar)
        self.Bind(wx.EVT_BUTTON, self.controlador.eventoDescifrar, self.bDescifrar)
        self.Bind(wx.EVT_BUTTON, self.controlador.eventoFirmar, self.bFirmar)
        self.Bind(wx.EVT_BUTTON, self.controlador.eventoVerificar, self.bVerificarF)
        self.Bind(wx.EVT_BUTTON, self.controlador.eventoCifrarFirmar, self.bCifrarFirmar)
        self.Bind(wx.EVT_BUTTON, self.controlador.eventoVerificarDesc, self.bVerificarDescifrar)
        self.Bind(wx.EVT_BUTTON, self.controlador.eventoBorrarSeguro, self.bBorrar)
        #self.Bind(wx.EVT_BUTTON, self.crearLlaves, self.bCrearLlave)
        
        self.Bind(wx.EVT_BUTTON, self.enviarArchivos, self.botonAdelante)
        self.Bind(wx.EVT_BUTTON, self.eliminarArchivos, self.botonAtras)

        #Eventos de los tree
        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.listSeleccionado, self.dirAnhadido)
        #Evento del ListCrtr de las unidades
        
        self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.itemSeleccionado, self.listUnidades)
        
        
        
        #Evento de los check box
        ##self.Bind(wx.EVT_CHECKBOX, self.onCheck, self.ckCifrar)
        ##self.Bind(wx.EVT_CHECKBOX, self.onCheck, self.ckFirmar)
        ##self.Bind(wx.EVT_CHECKBOX, self.onCheck, self.ckDescifrar)
    
    
    def borrarPapelera(self,evt):
        
        mensaje = self.controlador.borrarPapelera(self)
        msja(self,mensaje)
        
    def procesar(self,evt):
        
        self.controlador.procesar(evt.GetEventObject().GetId())
        

    def onCheck(self,evt):
        
        if self.ckCifrar.IsChecked() or self.ckFirmar.IsChecked() or self.ckDescifrar.IsChecked():
            self.iGuardar.Enable(True)
            self.bGuardar.Enable(True)
        else:
            self.iGuardar.SetValue("")
            self.iGuardar.Enable(False)
            self.bGuardar.Enable(False)
        
        
            
        
    def consultarLlaves(self,evt):
        #msja(self,"Modulo en construcción")
        win = FrameListaLlaves(self, -1, "Listar Llaves",
                  style = wx.DEFAULT_FRAME_STYLE)
        
        win.Show(True)
        self.parent.Enable(False)
        
        
    def exportarLlaves(self,evt):
        
        win = FrameExportarLlaves(self, -1, "Exportar Llaves",
                  style = wx.DEFAULT_FRAME_STYLE)
        
        win.Show(True)
        self.parent.Enable(False)

    def importarLlaves(self,evt):
        
        win = FrameImportarLlaves(self, -1, "Importar Llaves",
                  style = wx.DEFAULT_FRAME_STYLE)
        
        win.Show(True)
        self.parent.Enable(False)

    def crearLlaves(self,evt):
        
        win = FrameCrearLlaves(self, -1, "Crear Llaves",
                  style = wx.DEFAULT_FRAME_STYLE)
        
        win.Show(True)
        self.parent.Enable(False)
        


    def listSeleccionado(self,evt):

        self.itemDirAnhadido = evt.m_itemIndex

    def enviarArchivos(self,evt):
        
        self.controlador.enviarArchivos()
        

    def eliminarArchivos(self,evt):
        
        self.controlador.eliminarArchivos()


    def radioSeleccionado(self,evt):

        self.radio = evt.GetEventObject()
        self.controlador.radioSeleccionado()

    def itemSeleccionado(self,evt):
        
        self.itemListeleccionado = evt.m_itemIndex
    
    
    def verUnidad(self,evt):

        self.controlador.verUnidad()
            
    def guardarEn(self,evt):

        dlg = wx.DirDialog(self, "Seleccione un directorio:",
                          style=wx.DD_DEFAULT_STYLE
                           #| wx.DD_DIR_MUST_EXIST
                           #| wx.DD_CHANGE_DIR
                           )

        dlg.SetPath(os.environ['HOME'])

        if dlg.ShowModal() == wx.ID_OK:
            self.iGuardar.SetValue(dlg.GetPath())

        
        dlg.Destroy()


    #def ejecutar(self,evt):
    
    #    self.controlador.ejecutar()

    def OnCPSize(self,evt):
        self.SetPosition((0,0))
        self.SetSize(evt.GetSize())
    
    def funcTreeSeleccionado(self,evt):
        
        #No encontré la forma de evitar que este método sea llamado cuando
        #realizo un borrado de todos los items del tree. Es por eso que realicé
        #esta trampa, para evitar que cuando el tree es borrado y creado de nuevo
        #se le asignen valores True a los botones de montar unidad y eliminar unidad
        #Queda pendiente investigar como realizar esto sin hacer esta trampa que
        #es muy enredada
        
        if self.controlador.entrarEvento:
            self.treeSeleccionado = evt.GetItem()
            self.controlador.habilitarDesmontarUnidad(True)
            self.controlador.habilitarEliminarUnidad(True)
        else:
            self.controlador.entrarEvento = True
        
    def crearUnidad(self,evt):
        
        win = FrameCrearUnidad(self, -1, "Crear Unidad Cifrada", size=(290, 180),
                  style = wx.DEFAULT_FRAME_STYLE)
        
        win.Show(True)
        self.parent.Enable(False)
    
    def verificarMontarUnidad(self,evt):

        self.controlador.verificarMontarUnidad(FrameMontarUnidad)
        
    
    def desmontarUnidad(self,evt):

        self.controlador.desmontarUnidad()
    
    def eliminarUnidad(self,evt):
        
        self.controlador.eliminarUnidad()
        
        
    def firmarDatos(self,parent):
        while(True):
            dlg = FrameFirmar(parent)
            if dlg.ShowModal() == wx.ID_OK:
                if dlg.l2Hdigital.GetValue() != "" or dlg.iClave.GetValue() != "":
                    dlg.Destroy()    
                    return dlg.l2Hdigital.GetValue(),dlg.iClave.GetValue()
                else:
                    msja(self,u"¡Debe seleccionar un identificador y debe ingresar la clave!")
            else:
                dlg.Destroy()
                return False, False
                
    
    
    def cifrarDatos(self,parent):
    
        """
        while(True):
            dlg = wx.TextEntryDialog(parent, msj,'Tibisay',style=wx.OK | wx.CANCEL)
            if dlg.ShowModal() == wx.ID_OK:
                if dlg.GetValue() != "":
                    break
            
                dlg.Destroy()
            else:
                break
        """
        #
    
        while(True):
            dlg = FrameCifrar(parent)
            if dlg.ShowModal() == wx.ID_OK:
                if dlg.l2Hdigital.GetValue() != "":
                    dlg.Destroy()    
                    return dlg.l2Hdigital.GetValue()
            else:
                dlg.Destroy()
                return False
                
    

#############################################################################################################

class FrameCrearUnidad(wx.Frame):
    
    def __init__(
            self, parent, ID, title, pos=(100,100),
            size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE):

        
        wx.Frame.__init__(self, parent.parent, ID, title, pos, size, style)
        self.CenterOnParent(wx.BOTH)
        self.parent = parent
        self.parent.ventanaHija = self
        #self.msje = msje
        #self.msja = msja
        panel = wx.Panel(self,-1)
        ###########################################
        
        object_1 = wx.BoxSizer(wx.VERTICAL)
        #Componentes
        self.lNombre = wx.StaticText(panel, -1, "Nombre(*)")
        self.iNombre = wx.TextCtrl(panel, -1, "",size=(120,30))
        self.iNombre.SetToolTipString("Asigne un nombre a la unidad que desea crear")
        self.lClave = wx.StaticText(panel, -1, "Clave(*)")
        self.iClave = wx.TextCtrl(panel, -1, "",size=(120,30),style=wx.TE_PASSWORD)
        self.iClave.SetToolTipString("Ingrese la clave para la unidad que desea crear")
        self.lConfirmacion = wx.StaticText(panel, -1, "Confirmar Clave(*)")
        self.iConfirmacion = wx.TextCtrl(panel, -1, "",size=(120,30),style=wx.TE_PASSWORD)
        self.iConfirmacion.SetToolTipString("Vuelva a escribir la clave para su respectiva confirmación")
        self.bAceptar = wx.Button(panel, wx.ID_OK, size=(100,30))
        self.bCerrar = wx.Button(panel, wx.ID_CLOSE, size=(100,30))
        boxBotones = wx.BoxSizer(wx.HORIZONTAL)
        boxBotones.Add(self.bAceptar,0,wx.ALL,0)
        boxBotones.Add(self.bCerrar,0,wx.ALL,0)
        ##
        sizer = wx.FlexGridSizer(cols=2, hgap=4, vgap=4)
        sizer.AddMany([ self.lNombre, self.iNombre,
                        self.lClave, self.iClave,
                        self.lConfirmacion, self.iConfirmacion,
                        ])
        
        object_1.Add(sizer,0,wx.ALL,25)
        object_1.Add(boxBotones,0,wx.ALIGN_CENTER_HORIZONTAL,0)
        #Fijamos  los componentes a la ventana
        panel.SetSizer(object_1)
        #object_1.Fit(self) #ESTO FIJA LA VENTANA AL TAMAÑO DEL object_1
        self.Layout()
        
        #Eventos
        self.Bind(wx.EVT_BUTTON, self.crearUnidad, self.bAceptar)
        self.Bind(wx.EVT_BUTTON, self.cerrarVentana, self.bCerrar)
        self.Bind(wx.EVT_CLOSE, self.cerrarVentana)
    
            
    def cerrarVentana(self,event):
        #print "Estoy"
        self.parent.parent.Enable(True)
        self.Destroy()
        
    
    def crearUnidad(self,event):
        #Verificamos el password
        self.parent.controlador.crearUnidad(self.iNombre,self.iClave,self.iConfirmacion)
        
        
        
#############################################################################################################

class FrameExportarLlaves(wx.Frame):

    def __init__(
            self, parent, ID, title, pos=(100,100),
            size=(370,150), style=wx.DEFAULT_FRAME_STYLE):

        wx.Frame.__init__(self, parent.parent, ID, title, pos, size, style)
        self.CenterOnParent(wx.BOTH)
        self.parent = parent
        self.parent.ventanaHija = self
        panel = wx.Panel(self,-1)
        self.llavesPublicas = None
        
        boxVertical = wx.BoxSizer(wx.VERTICAL)
        #Componentes
        self.lCorreo = wx.StaticText(panel, -1, "Correo Electrónico(*):")
        self.iCorreo = wx.TextCtrl(panel, -1, "",size=(120,30))
        #self.elementosCombo = [[l[0].decode('utf8'),l[1].decode('utf8')] for l in self.parent.controlador.modelo.listarLaves(False)]
        # + [e[1] for e in self.elementosCombo]
        #self.iCorreo = wx.Choice(panel, -1, choices = ['-SELECCIONE-'])
        self.iCorreo.SetToolTipString("Correo electrónico asociado a las llaves que se desean exportar")
        self.lLlave = wx.StaticText(panel, -1, "Llave(*):")
        self.iLlave = wx.Choice(panel, -1, size=(120,-1), choices = ['-SELECCIONE-','Publica','Privada','Ambas'])
        self.iLlave.SetToolTipString("Seleccione el tipo de llave que desea exportar")
        self.lGuardarEn = wx.StaticText(panel, -1, "Guradar en(*):")
        self.iGuardarEn = wx.TextCtrl(panel, -1, "",size=(120,30))
        self.iGuardarEn.SetToolTipString("Ruta donde será exportada la llave seleccionada")
        self.bGuardarEn = wx.Button(panel, -1, "Examinar", size=(-1,30))
        boxGuardar = wx.BoxSizer(wx.HORIZONTAL)
        boxGuardar.Add(self.iGuardarEn,0,wx.ALL,0)
        boxGuardar.Add(self.bGuardarEn,0,wx.ALL,0)
        #
        self.bAceptar = wx.Button(panel, wx.ID_OK, size=(100,30))
        self.bCerrar = wx.Button(panel, wx.ID_CLOSE, size=(100,30))
        boxBotones = wx.BoxSizer(wx.HORIZONTAL)
        boxBotones.Add(self.bAceptar)
        boxBotones.Add(self.bCerrar)
        ##
        sizer = wx.FlexGridSizer(cols=2, hgap=4, vgap=4)
        sizer.AddMany([ self.lCorreo, self.iCorreo,
                        self.lLlave,self.iLlave,
                        self.lGuardarEn,boxGuardar,
                        ])
        
        boxVertical.Add(sizer,0,wx.ALL,10)
        boxVertical.Add(boxBotones,0,wx.ALIGN_CENTER_HORIZONTAL,0)
        #Fijamos  los componentes a la ventana
        panel.SetSizer(boxVertical)
        #object_1.Fit(self) #ESTO FIJA LA VENTANA AL TAMAÑO DEL object_1
        self.Layout()
        
        #Eventos
        self.Bind(wx.EVT_BUTTON, self.exportarLlaves, self.bAceptar)
        self.Bind(wx.EVT_BUTTON, self.cerrarVentana, self.bCerrar)
        self.Bind(wx.EVT_BUTTON, self.guardarEn, self.bGuardarEn)
        self.Bind(wx.EVT_CLOSE, self.cerrarVentana)
    
        
    def exportarLlaves(self,evt):
        
        self.parent.controlador.exportarLlaves(self.iGuardarEn,self.iCorreo,self.iLlave)
            
    def cerrarVentana(self,event):
        
        self.parent.parent.Enable(True)
        self.Destroy()

    def guardarEn(self,evt):

        dlg = wx.FileDialog(
            self, message="Guardar como ...", defaultDir=os.environ['HOME'], 
            defaultFile="", wildcard="Archivos de texto (*.asc)|*.asc|", style=wx.SAVE | wx.FD_OVERWRITE_PROMPT
            )

        dlg.SetFilterIndex(0)
        # Show the dialog and retrieve the user response. If it is the OK response, 
        # process the data.
        if dlg.ShowModal() == wx.ID_OK:
            self.iGuardarEn.SetValue(re.sub("(\.asc)*$","",dlg.GetPath()) + ".asc")

#############################################################################################################

class FrameImportarLlaves(wx.Frame):

    def __init__(
            self, parent, ID, title, pos=(100,100),
            size=(270,100), style=wx.DEFAULT_FRAME_STYLE):

        wx.Frame.__init__(self, parent.parent, ID, title, pos, size, style)
        self.CenterOnParent(wx.BOTH)
        self.parent = parent
        self.parent.ventanaHija = self

        boxVertical = wx.BoxSizer(wx.VERTICAL)
        boxHorizontal = wx.BoxSizer(wx.HORIZONTAL)
        panel = wx.Panel(self,-1)
        #Componentes
        self.lArchivo = wx.StaticText(panel, -1, "Archivo")
        self.iArchivo = wx.TextCtrl(panel, -1, "",size=(120,30))
        self.iArchivo.SetToolTipString("Ruta del archivo donde se encuentran las llaves a importar")
        self.bBuscar = wx.Button(panel, -1, "Examinar",size=(-1,30))        
        boxHorizontal.Add(self.lArchivo,0,wx.ALL,0)
        boxHorizontal.Add(self.iArchivo,0,wx.ALL,0)
        boxHorizontal.Add(self.bBuscar,0,wx.ALL,0)        
        self.bAceptar = wx.Button(panel,wx.ID_OK,size=(100,30))
        self.bCerrar = wx.Button(panel,wx.ID_CLOSE,size=(100,30))
        boxbotones = wx.BoxSizer(wx.HORIZONTAL)
        boxbotones.Add(self.bAceptar,0,wx.ALL,0)
        boxbotones.Add(self.bCerrar,0,wx.ALL,0)
        ##
        #sizer = wx.FlexGridSizer(cols=2, hgap=4, vgap=4)
        #sizer.AddMany([ self.lArchivo, boxHorizontal,
        #                self.bAceptar,self.bCerrar,
        #                ])
        
        boxVertical.Add(boxHorizontal,0,wx.ALL,10)
        boxVertical.Add(boxbotones,0,wx.ALIGN_CENTER_HORIZONTAL,0)
        
        
        #Fijamos  los componentes a la ventana
        panel.SetSizer(boxVertical)
        #object_1.Fit(self) #ESTO FIJA LA VENTANA AL TAMAÑO DEL object_1
        self.Layout()
        
        #Eventos
        self.Bind(wx.EVT_BUTTON, self.importarLlaves, self.bAceptar)
        self.Bind(wx.EVT_BUTTON, self.cerrarVentana, self.bCerrar)
        self.Bind(wx.EVT_BUTTON, self.buscarArchivo, self.bBuscar)
        self.Bind(wx.EVT_CLOSE, self.cerrarVentana)
    
    def importarLlaves(self,evt):
        
        self.parent.controlador.importarLlaves(self.iArchivo)
            
    def cerrarVentana(self,event):
        
        self.parent.parent.Enable(True)
        self.Destroy()

    def buscarArchivo(self,evt):

        dlg = wx.FileDialog(
            self, message="Seleccione un Archivo",
            defaultDir=os.environ['HOME'], 
            defaultFile="",
            wildcard="Archivos de texto (*.asc)|*.asc|",
            style=wx.OPEN | wx.CHANGE_DIR
            )

        # Show the dialog and retrieve the user response. If it is the OK response, 
        # process the data.
        if dlg.ShowModal() == wx.ID_OK:
            # This returns a Python list of files that were selected.
            
            self.iArchivo.SetValue(dlg.GetPath())

#############################################################################################################


class FrameMontarUnidad(wx.Frame):

    def __init__(
            self, parent, ID, title, pos=(100,100),
            size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE):

        #wx.Frame.__init__(self, parent, ID, title, pos, size, style)
        wx.Frame.__init__(self, parent.parent, ID, title, pos, size, style)
        self.CenterOnParent(wx.BOTH)
        self.parent = parent
        self.parent.ventanaHija = self
        #self.msje = msje
        #self.msja = msja
        panel = wx.Panel(self,wx.ID_ANY)
        object_1 = wx.BoxSizer(wx.VERTICAL)
        #Componentes
        self.lUnidad = wx.StaticText(panel, -1, "Unidad")
        self.l2Unidad = wx.StaticText(panel, -1, self.parent.listUnidades.GetItemText(self.parent.itemListeleccionado))
        self.lClave = wx.StaticText(panel, -1, "Clave(*)")
        self.iClave = wx.TextCtrl(panel, -1, "",size=(120,30),style=wx.TE_PASSWORD)
        self.bAceptar = wx.Button(panel, wx.ID_OK, size=(100,30))
        self.bCerrar = wx.Button(panel, wx.ID_CLOSE, size=(100,30))
        ##
        sizer = wx.FlexGridSizer(cols=2, hgap=4, vgap=4)
        sizer.AddMany([ self.lUnidad, self.l2Unidad,
                        self.lClave, self.iClave,
                        self.bAceptar,self.bCerrar,
                        ])
        
        object_1.Add(sizer,0,wx.ALL,25)
        #Fijamos  los componentes a la ventana
        panel.SetSizer(object_1)
        #object_1.Fit(self) #ESTO FIJA LA VENTANA AL TAMAÑO DEL object_1
        self.Layout()
        
        #Eventos
        self.Bind(wx.EVT_BUTTON, self.montarUnidad, self.bAceptar)
        self.Bind(wx.EVT_BUTTON, self.cerrarVentana, self.bCerrar)
        self.Bind(wx.EVT_CLOSE, self.cerrarVentana)
    
            
    def cerrarVentana(self,event):
        #print "Estoy"
        self.parent.parent.Enable(True)
        self.Destroy()
        
    
    def montarUnidad(self,event):
        #Verificamos el password
        self.parent.controlador.montarUnidad(self.l2Unidad,self.iClave)

#############################################################################################################
#### Creacion de Llaves
#############################################################################################################

class FrameCrearLlaves(wx.Frame):

    def __init__(
            self, parent, ID, title, pos=(100,100),
                 #375, 470
                 #389
            size=(430, 630), style=wx.DEFAULT_FRAME_STYLE):

        wx.Frame.__init__(self, parent.parent, ID, title, pos, size, style)
        self.CenterOnParent(wx.BOTH)
        self.parent = parent
        self.parent.ventanaHija = self
        panel = wx.Panel(self,-1)
        
        boxVertical = wx.BoxSizer(wx.VERTICAL)
        #titulo = wx.StaticText(self, -1, "Crear de Llaves")
        #boxVertical.Add(titulo,0,wx.ALL,25)
        #Componentes
        self.lNombre = wx.StaticText(panel, -1, "Nombre Completo(*):")
        self.iNombre = wx.TextCtrl(panel, -1, "",size=(170,30))
        self.iNombre.SetToolTipString("Nombre comleto de la persona dueña de la llave a crear")
        self.lCorreo = wx.StaticText(panel, -1, "Correo electrónico(*):")
        self.iCorreo = wx.TextCtrl(panel, -1, "",size=(170,30)) #style=wx.TE_PASSWORD
        self.iCorreo.SetToolTipString("Correo electronico del dueño de la clave. Este correo se utilizará luego para realizar firmas o encriptar documentos")
        self.lClave = wx.StaticText(panel, -1, "Clave(*):")
        self.iClave = wx.TextCtrl(panel, -1, "",size=(170,30),style=wx.TE_PASSWORD)
        self.iClave.SetToolTipString("Ingrese la clave a la que asociará el par de llaves que está creando")
        self.lConfirmacion = wx.StaticText(panel, -1, "Confirmar Clave(*):")
        self.iConfirmacion = wx.TextCtrl(panel, -1, "",size=(170,30),style=wx.TE_PASSWORD)
        self.iConfirmacion.SetToolTipString("Vuelva a ingrear la clave para su respectiva confirmación")
        self.lTipo = wx.StaticText(panel, -1, "Tipo(*):")
        self.iTipo = wx.Choice(panel, -1, (50, 50), choices = ['DSA','RSA'])#self.parent.controlador.modelo.listarBD()
        self.iTipo.SetToolTipString("Seleccione el tipo de cifrado a utilizar: DSA o RSA")
        self.lLongitud = wx.StaticText(panel, -1, "Longitud(*):")
        self.iLongitud = wx.Choice(panel, -1, (50, 50), choices = ['2048','1024'])
        self.iLongitud.SetToolTipString("Seleccione la longitud del cifrado. Se recomienda 2048")
        self.lComentario = wx.StaticText(panel, -1, "Comentario:")
        self.iComentario = wx.TextCtrl(panel, -1, "",size=(200, 100), style=wx.TE_MULTILINE|wx.TE_RICH2)
        self.iComentario.SetToolTipString("Asocie un comentario al par de llaves que esta creando")
        self.lExpiracion = wx.StaticText(panel, -1, "Expiración(*):")
        #self.rNunca = wx.RadioButton(panel,5015, "Nunca", style = wx.RB_GROUP )
        self.lVacio = wx.StaticText(panel, -1, "")
        #self.rFecha = wx.RadioButton(panel,5016, "Fecha:")
        self.fechaCalendario = wx.TextCtrl(panel, -1, "",size=(170,30),style=wx.TE_READONLY)
        self.fechaCalendario.SetToolTipString("Fecha de expiración de la llave que se está creando")
        #self.fechaCalendario.Enable(False)
        self.cal = wx.calendar.CalendarCtrl(panel, -1, wx.DateTime_Now(),size=(260,180),
                             style = wx.calendar.CAL_SEQUENTIAL_MONTH_SELECTION
                             #| wx.calendar.CAL_SHOW_HOLIDAYS
                             #| wx.calendar.CAL_SUNDAY_FIRST
                             )
        #self.cal.PySetLowerDateLimit(datetime.date(time.localtime()[0:1][0],time.localtime()[1:2][0],time.localtime()[2:3][0]))
        #Obtenemos la fecha de hoy y le sumamos un dia
        fechaMinima = datetime.date.today() + datetime.timedelta(days=1)
        self.cal.PySetLowerDateLimit(fechaMinima)
        
        #self.cal.Show(False)
        #boxFecha = wx.BoxSizer(wx.HORIZONTAL)
        #boxFecha.Add(self.rFecha,0,wx.ALL,0)
        #boxFecha.Add(self.fechaCalendario,0,wx.ALL,0)

        self.bAceptar = wx.Button(panel, wx.ID_OK, size=(100,30))
        self.bCerrar = wx.Button(panel,wx.ID_CLOSE,size=(100,30))
        boxBotones = wx.BoxSizer(wx.HORIZONTAL)
        boxBotones.Add(self.bAceptar,0,wx.ALL,0)
        boxBotones.Add(self.bCerrar,0,wx.ALL,0)

        ##
        sizer = wx.FlexGridSizer(cols=2, hgap=4, vgap=4)
        sizer.AddMany([ self.lNombre, self.iNombre,
                        self.lCorreo, self.iCorreo,
                        self.lClave, self.iClave,
                        self.lConfirmacion, self.iConfirmacion,
                        self.lTipo, self.iTipo,
                        self.lLongitud, self.iLongitud,
                        self.lComentario, self.iComentario,
                        #self.lExpiracion, self.rNunca,
                        self.lExpiracion,self.fechaCalendario,
                        self.lVacio,self.cal,
                        ])
        
        boxVertical.Add(sizer,0,wx.ALL,25)
        boxVertical.Add(boxBotones,0,wx.LEFT,100)
        
        #Fijamos  los componentes a la ventana
        panel.SetSizer(boxVertical)
        self.Layout()
        
        #Eventos
        self.Bind(wx.EVT_BUTTON, self.crearLlaves, self.bAceptar)
        self.Bind(wx.EVT_BUTTON, self.cerrarVentana, self.bCerrar)
        #self.iNombre.Bind(wx.EVT_CHAR,self.nextTextCtrl)
        self.Bind(wx.EVT_CLOSE, self.cerrarVentana)
        #self.Bind(wx.EVT_KILL_FOCUS, self.radioSeleccionado,self.rNunca)
        ##self.fechaCalendario.Bind(wx.EVT_CHILD_FOCUS, self.fechaSeleccionada)
        self.fechaCalendario.Bind(wx.EVT_KEY_UP, self.fechaSeleccionada)
        ##self.fechaCalendario.Bind(wx.EVT_KILL_FOCUS, self.fechaDeseleccionada)
        
        #self.Bind(wx.EVT_CHILD_FOCUS, self.radioSeleccionado,self.fechaCalendario)
        #wx.EVT_TEXT_ENTER
        #self.Bind(wx.EVT_RADIOBUTTON, self.radioSeleccionado,self.rFecha)
        self.Bind(wx.calendar.EVT_CALENDAR_MONTH, self.OnChangeMonth, self.cal)
        self.Bind(wx.calendar.EVT_CALENDAR_DAY, self.OnChangeMonth, self.cal)

        #self.fechaCalendario.Bind(wx.EVT_SET_FOCUS, self.focus)
        

    def nextTextCtrl(self,evt):

        print 'Estoy'

    def OnChangeMonth(self,evt):
        fecha = evt.GetDate()
        #self.fechaCalendario.SetValue('%s-%s-%s' % (fecha.Year,fecha.Month+1,fecha.Day))
        self.fechaCalendario.SetValue('%s' % fecha.FormatISODate())
        
    """
    def focus(self,evt):

        self.cal.Show(True)
        self.Size = (360, 520)
    
    """
    def fechaSeleccionada(self,evt):
        
        #self.fechaCalendario.Enable(True)
        ##self.cal.Show(True)
        ##self.Size = (389, 630)
        #375, 470
        msja(self,"¡Seleccione la fecha del calendario!")
        
    """
    def fechaDeseleccionada(self,evt):
        
        #self.fechaCalendario.SetValue('')
        #self.fechaCalendario.Enable(False)
        self.cal.Show(False)
        self.Size = (375, 470)
    """    
    """
    def radioSeleccionado(self,evt):
        
        print "Hola"

        if evt.GetId() == 5015:
            self.fechaCalendario.SetValue('')
            self.fechaCalendario.Enable(False)
            self.cal.Show(False)
            self.Size = (360, 470)

        elif evt.GetId() == 5016:
            self.fechaCalendario.Enable(True)
            self.cal.Show(True)
            self.Size = (370, 630)
            
        else:
            print 'Error'
    """      

    def cerrarVentana(self,event):
        #print "Estoy"
        self.parent.parent.Enable(True)
        self.Destroy()
        
    
    def crearLlaves(self,event):
        #Verificamos el password
        
        self.parent.controlador.crearLlaves(self.iNombre,
        self.iCorreo,
        self.iClave,
        self.iConfirmacion,
        self.iTipo,
        self.iLongitud,
        self.iComentario,
        self.fechaCalendario)#self.rFecha

#############################################################################################################
class FrameFirmar(wx.Dialog):
    

    def __init__(self,parent):
        
        wx.Dialog.__init__(self, parent,title="Identificador Firmar")
        self.parent = parent
        
        """
        for l in self.parent.controlador.modelo.listarLaves(True):
            print l
        
        """
        self.lTitulo = wx.StaticText(self,-1,"INGRESO INDENTIFICADOR PARA FIRMAR")
        self.lTitulo.SetFont(wx.Font(9, wx.DEFAULT, wx.BOLD, wx.NORMAL, 0, ""))
        self.lUid = wx.StaticText(self, -1, "Identificador",style=wx.ALIGN_RIGHT)
        #print [l[1].decode('utf8') for l in self.parent.controlador.modelo.listarLaves(True)]
        self.elementosCombo = [[l[0].decode('utf8'),l[1].decode('utf8')] for l in self.parent.controlador.modelo.listarLaves(True)]
        self.iUid = wx.Choice(self, -1, choices = ['-SELECCIONE-'] + [e[1] for e in self.elementosCombo])
        self.iUid.SetMinSize((250,30))
        self.iUid.SetToolTipString("Seleccione el identificador del usuario para firmar los datos")
        self.lHdigital = wx.StaticText(self, -1, "Huella Digital")
        self.l2Hdigital = wx.TextCtrl(self, -1, "",size=(250,30))
        #self.l2Hdigital.SetMinSize((250,30))
        self.l2Hdigital.Disable()
        self.l2Hdigital.SetToolTipString("La huella digital asociada al identificardor seleccionado")
        self.lClave = wx.StaticText(self,-1,"Clave")
        self.lClave.SetToolTipString("Clave asociada al identificador seleccionado")
        self.iClave = wx.TextCtrl(self,-1,"",style=wx.PASSWORD)
        self.iClave.SetMinSize((250,30))
        
        bCrearLlaves = wx.Button(self, -1,"Crear Llave")
        bOk = wx.Button(self, id=wx.ID_OK)
        bCancelar = wx.Button(self, id=wx.ID_CANCEL)
        
        boxBotones = wx.BoxSizer(wx.HORIZONTAL)
        eventManager.Register(dropArgs(curry(self.EndModal, wx.ID_OK)), wx.EVT_BUTTON,bOk)
        eventManager.Register(dropArgs(curry(self.EndModal, wx.ID_CANCEL)), wx.EVT_BUTTON,bCancelar)
        boxBotones.Add(bCancelar, flag=wx.ALL, border=5)
        boxBotones.Add(bOk,flag=wx.ALL, border=5)
        
        boxBotonUID = wx.BoxSizer(wx.HORIZONTAL)
        boxBotonUID.Add(self.iUid,0,wx.ALL,0)
        boxBotonUID.Add(bCrearLlaves,0,wx.ALL,0)
        
        ##
        sizer = wx.FlexGridSizer(cols=2, hgap=0, vgap=4)
        sizer.AddMany([ self.lUid, boxBotonUID,
                        self.lHdigital, self.l2Hdigital,
                        self.lClave, self.iClave,
                        ])
        
        
        boxVertical = wx.BoxSizer(wx.VERTICAL)
        boxVertical.Add(self.lTitulo,flag = wx.ALIGN_CENTER_HORIZONTAL | wx.TOP, border=10)
        boxVertical.Add(sizer,0,wx.ALL,25)
        #object_1.Add(boxBotones,0,wx.LEFT,50)
        boxVertical.Add(boxBotones,0,wx.ALIGN_CENTER_HORIZONTAL,0)
        
        self.SetSizer(boxVertical)
        boxVertical.Fit(self)
        #self.Fit()
        
        self.Bind(wx.EVT_CHOICE,self.seleccion,self.iUid)
        
    def seleccion(self,evt):
        
        s = self.iUid.GetCurrentSelection()
        #Si la seleccion es la posicion cero significa que el usuario esta en SELECCIONE
        if s == 0:
            self.l2Hdigital.SetValue('')
            self.l2Hdigital.SetToolTipString('La huella digital asociada al identificardor seleccionado')
        else:
            fingerPrint = self.elementosCombo[self.iUid.GetCurrentSelection()-1][0]
            self.l2Hdigital.SetValue(fingerPrint)
            #size = self.l2Hdigital.GetBestSize()
            #self.l2Hdigital.SetMinSize(size)
            self.l2Hdigital.SetToolTipString(fingerPrint)

#############################################################################################################
class FrameCifrar(wx.Dialog):
    

    def __init__(self,parent):
        
        wx.Dialog.__init__(self, parent,title="Indentificador Cifrar")
        self.parent = parent
        
        self.lTitulo = wx.StaticText(self,-1,"INGRESO INDENTIFICADOR PARA CIFRAR")
        self.lTitulo.SetFont(wx.Font(9, wx.DEFAULT, wx.BOLD, wx.NORMAL, 0, ""))
        self.lUid = wx.StaticText(self, -1, "Identificador",style=wx.ALIGN_RIGHT)
        #print [l[1].decode('utf8') for l in self.parent.controlador.modelo.listarLaves(True)]
        self.elementosCombo = [[l[0].decode('utf8'),l[1].decode('utf8')] for l in self.parent.controlador.modelo.listarLaves(False)]
        self.iUid = wx.Choice(self, -1, choices = ['-SELECCIONE-'] + [e[1] for e in self.elementosCombo])
        self.iUid.SetMinSize((250,30))
        self.iUid.SetToolTipString("Seleccione el identificador del usuario para cifrar los datos")
        self.lHdigital = wx.StaticText(self, -1, "Huella Digital")
        self.l2Hdigital = wx.TextCtrl(self, -1, "",size=(250,30))
        #self.l2Hdigital.SetMinSize((250,30))
        #SetMaxSize
        self.l2Hdigital.Disable()
        self.l2Hdigital.SetToolTipString("La huella digital asociada al identificardor seleccionado")
        
        bOk = wx.Button(self, id=wx.ID_OK)
        bCancelar = wx.Button(self, id=wx.ID_CANCEL)
        
        boxBotones = wx.BoxSizer(wx.HORIZONTAL)
        eventManager.Register(dropArgs(curry(self.EndModal, wx.ID_OK)), wx.EVT_BUTTON,bOk)
        eventManager.Register(dropArgs(curry(self.EndModal, wx.ID_CANCEL)), wx.EVT_BUTTON,bCancelar)
        boxBotones.Add(bCancelar, flag=wx.ALL, border=5)
        boxBotones.Add(bOk,flag=wx.ALL, border=5)
        
        
        ##
        sizer = wx.FlexGridSizer(cols=2, hgap=0, vgap=4)
        sizer.AddMany([ self.lUid, self.iUid,
                        self.lHdigital, self.l2Hdigital,
                        ])
        
        boxVertical = wx.BoxSizer(wx.VERTICAL)
        boxVertical.Add(self.lTitulo,5, flag = wx.TOP | wx.ALIGN_CENTER_HORIZONTAL, border=10)
        boxVertical.Add(sizer,0,wx.ALL,25)
        #object_1.Add(boxBotones,0,wx.LEFT,50)
        boxVertical.Add(boxBotones,0,wx.ALIGN_CENTER_HORIZONTAL,0)
        
        self.SetSizer(boxVertical)
        boxVertical.Fit(self)
        #self.Fit()
        
        self.Bind(wx.EVT_CHOICE,self.seleccion,self.iUid)
        #self.Bind(wx.EVT_BUTTON,self.verificar,bOk)
        
        
    def seleccion(self,evt):
        
        s = self.iUid.GetCurrentSelection()
        #Si la seleccion es la posicion cero significa que el usuario esta en SELECCIONE
        if s == 0:
            self.l2Hdigital.SetValue('')
            self.l2Hdigital.SetToolTipString('La huella digital asociada al identificador seleccionado')
        else:
            fingerPrint = self.elementosCombo[self.iUid.GetCurrentSelection()-1][0]
            self.l2Hdigital.SetValue(fingerPrint)
            size = self.l2Hdigital.GetBestSize()
            self.l2Hdigital.SetMinSize(size)
            self.l2Hdigital.SetToolTipString(fingerPrint)

#############################################################################################################

class FrameListaLlaves(wx.Frame):
    
    def __init__(
            self, parent, ID, title, pos=(100,100),
                 #375, 470
                 #389
            size=(700, 450), style=wx.DEFAULT_FRAME_STYLE):

        wx.Frame.__init__(self, parent.parent, ID, title, pos, size, style)
        self.CenterOnParent(wx.BOTH)
        self.parent = parent
        self.parent.ventanaHija = self
        self.panel = wx.Panel(self,-1)
        
        #self.lTitulo = wx.StaticText(self.panel, -1, "Listar Llaves")
        self.lTipo = wx.StaticText(self.panel, -1, "LISTAR LLAVES:")
        self.iTipo = wx.Choice(self.panel, -1, size=(120,-1), choices = ['-SELECCIONE-','Publicas','Privadas'])
        self.bEliminar = wx.Button(self.panel, wx.ID_DELETE, size=(-1,30))
        self.bCerrar = wx.Button(self.panel, wx.ID_CLOSE,size=(-1,30))
        
        boxBotones = wx.BoxSizer(wx.HORIZONTAL)
        boxBotones.Add(self.bEliminar,0,wx.ALL,0)
        boxBotones.Add(self.bCerrar,0,wx.ALL,0)
        
        boxHorizontal = wx.BoxSizer(wx.HORIZONTAL)
        boxHorizontal.Add(self.lTipo,0,wx.ALL,0)
        boxHorizontal.Add(self.iTipo,0,wx.ALL,0)
        
        boxVertical = wx.BoxSizer(wx.VERTICAL)
        #boxVertical.Add(self.lTitulo,0,wx.ALIGN_CENTER | wx.TOP,10)
        boxVertical.Add(boxHorizontal,0,wx.ALL,20)
        self.crearListCtrl()
        boxVertical.Add(self.ctrlLlaves,0,wx.TOP | wx.ALIGN_CENTER,10)
        boxVertical.Add(boxBotones,0,wx.TOP | wx.ALIGN_CENTER,10)
        self.panel.SetSizer(boxVertical)
        
        
        self.Bind(wx.EVT_BUTTON, self.eliminarLlaves, self.bEliminar)
        self.Bind(wx.EVT_BUTTON, self.cerrarVentana, self.bCerrar)
        self.Bind(wx.EVT_CLOSE, self.cerrarVentana)
        self.Bind(wx.EVT_CHOICE,self.getSeleccion,self.iTipo)
        
    def getSeleccion(self,evt):
        
        self.parent.controlador.cargarLlaves(self.parent,self.ctrlLlaves,self.iTipo.GetCurrentSelection())
            
        
            
    def eliminarLlaves(self,evt):
        
        if self.ctrlLlaves.llavesSeleccionadas:
            if msjp(self,"¿Esta seguro de querer eliminar las llaves seleccionadas?"):
                self.parent.controlador.eliminarLlaves(self.ctrlLlaves.llavesSeleccionadas,self.iTipo.GetString(self.iTipo.GetCurrentSelection()))
                self.getSeleccion(None)
                msja(self.parent.ventanaHija,"Las llaves fueron eliminadas exitosamente")
        else:
            msja(self.parent.ventanaHija,"¡Debe seleccionar por lo menos una llave para poder ser eliminada!")
    
        
    
            
    def cerrarVentana(self,event):
        #print "Estoy"
        self.parent.parent.Enable(True)
        self.Destroy()
        
        
    def crearListCtrl(self):
        
        self.ctrlLlaves = CheckListCtrl(self.panel)
                                
        #self.listaImagenes = wx.ImageList(16, 16)
        #Cramos la  imagen de carpeta en a lista del listctrl
        #self.directorio = self.listaImagenes.Add(wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN,   wx.ART_OTHER, (16,16)))
        #self.archivo = self.listaImagenes.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, (16,16)))

        
        #self.dirAnhadido.SetImageList(self.listaImagenes, wx.IMAGE_LIST_SMALL)
        self.ctrlLlaves.InsertColumn(0, "Huella")
        self.ctrlLlaves.SetColumnWidth(0,265)
        self.ctrlLlaves.InsertColumn(1, "ID Usuario")
        self.ctrlLlaves.SetColumnWidth(1,265)
        self.ctrlLlaves.InsertColumn(2, "Creación")
        self.ctrlLlaves.SetColumnWidth(2,85)#wx.LIST_AUTOSIZE
        self.ctrlLlaves.InsertColumn(3, "Expiración")
        self.ctrlLlaves.SetColumnWidth(3,85)
        
        #cb1 = wx.CheckBox(self.panel, -1, "Apples")
        #index = self.vista.listUnidades.InsertImageStringItem(sys.maxint,u,self.vista.directorio)
        #self.vista.listUnidades.SetItemData(index,0)
        #self.vista.listUnidades.SetStringItem(index, 1, "Desmontada")
        """
        index = self.ctrlLlaves.InsertStringItem(sys.maxint,"Texto col 1")
        self.ctrlLlaves.SetStringItem(index, 1, "Texot col2")
        self.ctrlLlaves.SetStringItem(index, 2, "Texot col3")
        self.ctrlLlaves.SetStringItem(index, 3, "Texot col4")
        self.ctrlLlaves.SetItemData(index, 0)
        """
        
        
        
############################################################################################
class CheckListCtrl(wx.ListCtrl, CheckListCtrlMixin):
    
                
    def __init__(self, parent,size=(700,320), style=wx.BORDER_SUNKEN
                                 | wx.LC_REPORT 
                                 #| wx.BORDER_NONE
                                 #| wx.LC_EDIT_LABELS
                                 #| wx.LC_SORT_ASCENDING
                                 #| wx.LC_NO_HEADER
                                 | wx.LC_VRULES
                                 | wx.LC_HRULES
                                 | wx.LC_SINGLE_SEL):

        self.llavesSeleccionadas = []                                    
                                     
        wx.ListCtrl.__init__(self, parent, -1, size=size, style=style)
        CheckListCtrlMixin.__init__(self)
    
    def OnCheckItem(self, index, flag):
            #data = self.GetItemData(index)
            #print self.GetItemText(index)
            if flag:
                #what = "checked"
                self.llavesSeleccionadas.append(self.GetItemText(index))
            else:
                #what = "unchecked"
                try:
                    self.llavesSeleccionadas.remove(self.GetItemText(index))
                except ValueError:
                    pass
            
            #self.log.write('item "%s", at index %d was %s\n' % (title, index, what))
            #print what
